package com.atguigu.config;

import com.atguigu.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * bean 的生命周期
 *    bean的创建   初始化   销毁
 * 容器管理
 * 我们可以自定义 初始化 和销毁
 *
 * BeanPostProcessor.postProcessBeforeInitialization
 * 初始化：对象创建完成，赋值好，调用初始化方法
 * BeanPostProcessor.postProcessAfterInitialization
 * 销毁：
 *       单实例：容器关闭时候
 *       多实例：容器不会管理
 *
 * 遍历得到容器中所有的BeanPostProcessor 挨个执行beforeInitialization
 * 一旦返回null，跳出for循环，不会执行后面的BeanPostProcessor.postProcessBeforeInitialization
 *
 * BeanPostProcessor的原理
 * populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值
 * initializeBean
 * {
 *  applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
 *  invokeInitMethods(beanName, wrappedBean, mbd);执行初始化
 *  applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
 * }
 * 1).指定初始化和销毁方法
 *       通过@Bean指定 int method   destory method
 * 2).通过让bean实现InitializingBean(定义初始化逻辑)，DisposableBean(定义销毁逻辑)
 * 3).可以使用JSR250
 *      @PostConstruct:在bean创建完成并且属性赋值完成
 *      @PreDestory:在容器销毁bean之前通知我们进行清理工作
 * 4).BeanPostProcessor:bean的后置处理器
 *      在bean初始化前后进行一些处理工作
 *      postProcessBeforeInitialization:
 *      postProcessAfterInitialization:
 *
 *
 *
 * spring底层对BeanPostProcessor的使用
 *      bean赋值，注入其他组件，@Autowired，生命周期注释功能，@Async 等等 => BeanPostProcessor
 */
@ComponentScan("com.atguigu.bean")
@Configuration
public class MainConfigOfLifeCycle {

    //@Scope("prototype")
    @Bean(initMethod = "init",destroyMethod = "destory")
    public Car car(){
        return new Car();
    }
}
